////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxjpegquanttable.h
/// @brief JPEG quantization table class
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// @todo (CAMX-1988) Code clean up apply NC001 coding standard on entire project
/// @todo (CAMX-1989) Code clean up apply GR030 coding standard on entire project

#ifndef CAMXJPEGQUANTTABLE_H
#define CAMXJPEGQUANTTABLE_H

#include "camxdefs.h"
#include "camxtypes.h"
#include "camxutils.h"
#include "camxstaticcaps.h"

CAMX_NAMESPACE_BEGIN

// NOWHINE NC006: Defining these because static vairables give compiler warnings
#define QuantizationTableVendorTagSection    "org.quic.camera2.jpegquantizationtables" ///< Quantization vendor Tag section

// NOWHINE NC006: Defining these because static vairables give compiler warnings
#define QuantizationTableLumaVendorTagName   "OEMJPEGLumaQuantizationTable"            ///< Quantization vendor tag name

// NOWHINE NC006: Defining these because static vairables give compiler warnings
#define QuantizationTableChromaVendorTagName "OEMJPEGChromaQuantizationTable"          ///< Quantization vendor tag name

/// @brief Quantization table types
enum class QuantTableType
{
    QuantTableMin,                   ///< quantization type min
    QuantTableLuma = QuantTableMin,  ///< quantization type luma
    QuantTableChroma,                ///< quantization type chroma
    QuantTableMax                    ///< quantization type max
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for jpeg quantization table
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class JPEGQuantTable
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// JPEGQuantTable
    ///
    /// @brief  Default constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    JPEGQuantTable();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// JPEGQuantTable
    ///
    /// @brief  Constructor with quntization type as input
    ///
    /// @param  type Quantization tabel type
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    explicit JPEGQuantTable(
        QuantTableType type);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~JPEGQuantTable
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ~JPEGQuantTable();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateTable
    ///
    /// @brief  Sets the quantization tabel base on quality
    ///
    /// @param  quality  Jpeg quality level
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void UpdateTable(
        UINT32 quality);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetTable
    ///
    /// @brief  Sets the quantization tabel value
    ///
    /// @param  pTable  Pointer to table
    ///
    /// @return return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult SetTable(
        UINT16* pTable);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetDefaultTable
    ///
    /// @brief  Sets the default quantization tabel base on quality
    ///
    /// @param  quality  Jpeg quality level
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void SetDefaultTable(
        UINT32 quality);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetTable
    ///
    /// @brief  Sets the default quantization tabel base on quality
    ///
    /// @return Quntization tabel
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE UINT16* GetTable()
    {
        return m_table;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetType
    ///
    /// @brief  Sets the quantization tabel type
    ///
    /// @param  type Quantization tabel type
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE void SetType(
        QuantTableType type)
    {
        m_type = type;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetType
    ///
    /// @brief  Gets the quantization tabel type
    ///
    /// @return Quantization table type
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE QuantTableType GetType()
    {
        return m_type;
    }

private:
    JPEGQuantTable(const JPEGQuantTable&) = delete;                 ///< Disallow the copy constructor.
    JPEGQuantTable& operator=(const JPEGQuantTable&) = delete;      ///< Disallow assignment operator.

    QuantTableType m_type;            ///< Quantization type
    UINT16 m_table[QuantTableSize];   ///< Quantization table
};

CAMX_NAMESPACE_END

#endif // CAMXJPEGQUANTTABLE_H
